Computer systems may be coupled together in various ways to enable communications between them, including being coupled together in networks such as local area networks (LANs), wide area networks (WANs), or combinations of networks, such as the Internet. Data may be transferred (e.g., copied or moved) between computer systems in various ways. For instance, an application executing at a first computer system may generate a query, which is a request for particular data. The query may be transmitted to a second computer system, which contains or has access to a data source containing the desired data. The second computer system responds to the query by transmitting the requested data to the first computer system.
Currently, applications and services are being developed with a common set of characteristics that are similar to those that enable the scale of the World Wide Web. These characteristics include the use of REST (representational state transfer) interfaces for accessing resources, a URI (Uniform Resource Identifier) namespace that identifies the resources, simple payload formats or representations, and a stateless request-response interaction model. These applications and services enable web-based data sources to be accessed in a more efficient manner.
An example of such an application is the Microsoft® .NET Framework published by Microsoft Corporation of Redmond, Wash. The .NET Framework is a software framework providing a large library of coded solutions. The ADO.NET Data Services of the .NET Framework provide rules to expose an HTTP (hypertext transfer protocol) interface for a data source to receive queries, as well as an implementation of those rules in the form of a library or framework that developers may use to create services. Data of such a data source can be accessed through such an interface using URIs.
Language integrated query (LINQ) is a Microsoft® .NET Framework component that add querying capabilities to programming languages supported by the .NET Framework. When compiled, LINQ queries are converted into an expression tree. The expression tree is subsequently converted into a query that is understandable to a particular targeted datastore. This conversion is performed on a datastore-by-datastore basis, which requires additional effort and increases system complexity.